Skip to content

net_nfs3: stop bitmap walks after truncated replies - #19974

Merged
LibretroAdmin merged 2 commits into
libretro:masterfrom
acts-1631:nfs4-bitmap-bounds
Nov 4, 2026
Merged

LibretroAdmin merged 2 commits into
libretro:masterfrom
acts-1631:nfs4-bitmap-bounds

Conversation

@acts-1631

Copy link
Copy Markdown
Contributor

NFSv4 bitmap word counts in fattr4 and OPEN replies come from the
server. nfs4_get_fattr() and nfs4_open_create() keep decrementing the
declared count after the XDR cursor has failed, so a short malicious
reply with a maximum count forces billions of iterations and stalls the
frontend.

Stop the bitmap walks when the cursor fails, matching the existing safe
nfs4_open_reclaim() path. This preserves support for extra bitmap words
while bounding the work to bytes actually received.

acts-1631 and others added 2 commits November 1, 2026 19:18
NFSv4 bitmap word counts come from the server. Once an XDR cursor
failed, two loops kept decrementing the declared count, allowing a
short reply to consume billions of iterations.

Stop both walks on cursor failure, matching the existing reclaim path.
Fixed-size fields in replies (stateids, verifiers, the session id)
are read through xdr_get_fixed and xdr_skip, so the cursor never
passes the end of a reply; nfs4_res reports a cut-short result as
NFS4ERR_BADXDR rather than NFS4_OK. OPEN results share one parser
for create and reclaim and READDIR pages one taker for v3 and v4,
each leaving the caller's state alone for a truncated reply, and
xdr_get_opaque checks a length and its pad apart so neither wraps
on 32-bit targets.

samples/network/nfs_retro/nfs_reply_bounds_test drives these
decoders on short and hostile replies placed at the end of their
allocations; local_unfs3_test.sh runs it ahead of the server
matrix.
@LibretroAdmin
LibretroAdmin merged commit a8e46dc into libretro:master Nov 4, 2026
30 of 31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants